<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var  obj = {
            name:'zhangpeng',
            age:18,
            sing:function(){
                console.log(this);
                console.log('精神小伙');
            }
        }
        var  arrs = [1,2,'a','b',[3,4,5]];

        function test(num1,num2){
            console.group('函数内的打印:')
            console.log('num1:',num1)
            console.log('num2:',num2)
            console.log('this',this)
            console.groupEnd
        }

        test(10,20);


        // 上面默认 this 代表window 

        // 想要this 指向 对象 obj 

        // call 
        // 函数名.call();
        // 对象.函数名.call();
        // call的参数  
        // 第一个 你想把this指向谁  
        // 从第二个到最后 依次给函数形参赋值  

        // test.call(obj,30,40);
        // test.call(arrs,30,40);



        // apply  
        // 函数名.apply();
        // 对象.函数名.apply();
        // apply的参数  
        // 第一个 你想把this指向谁  
        // 从第二个一定是数组  
        //  数组中是给形参赋值的实参 


        // test.apply(arrs,[30,40]);
        // // 给函数形参赋值的放到数组中 
        // test.apply(obj,[30,40]);




        // test函数立即执行  


         // bind
        // 函数名.bind();
        // 对象.函数名.bind();
        // bind  参数
        // 第一个 你想把this指向谁  
        // 从第二个到最后 依次给函数形参赋值 
        
        // 相比较 call  apply 函数不会立即执行
        //而是返回一个新的函数  
        // 这个函数 是已经改变了this指向的函数 

        var newfunc = test.bind(obj,50,60);
        // newfunc 就是返回的新的函数 
        // 这个函数 是改变了this指向的 test函数  

        newfunc()

        var newfunc1 = test.bind(arrs,50,60);
        // newfunc 就是返回的新的函数 
        // 这个函数 是改变了this指向的 test函数  

        newfunc1()
    </script>
</body>
</html>